$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Час 14 - Обрада структура података коришћењем петљи

До сада смо бројачку петљу for користили само у комбинацији са функцијом range чиме смо постизали да бројачка променљива узима бројевне вредности из неког опсега. У овом поглављу ћемо се упознати и са другим облицима коришћења петље for који ће нам омогућити да анализирамо један по један елемент садржан у некој структури података.

Пролазак кроз торку/листу/ниску

Петља for ... in ... : се може употребити и да се проће кроз све елементе неке дате торке/листе/ниске. На пример, ако је l листа, тада for i in l: проузрокује да променљива i узима редом елементе листе l, по један у сваком кораку. Илуструјмо то следећим примером.

Оперативни системи

Дата је листа у којој се налази списак неколико оперативних система. Исписаћемо све елементе ове листе (сваки у посебној линији).

Други начин је да употребимо бројачку променљиву и да елементима листе приступамо на основу индекса. На тај начин уз сваки систем можемо исписати и његов редни број. Бројачка променљива узима редом вредности од 0, па све до броја који је за један мањи од дужине листе. Ако редни бројеви иду од 1 па до дужине листе, редни број је у сваком кораку за један већи од вредности бројачке променљиве.

Иако је некада неопходно употребити и овај приступ, јасно је да се на први начин добија јаснији и лепши текст програма.

Годишња доба

Годишња доба се понављају у круг: пролеће, лето, јесен, зима, пролеће, лето, јесен, зима и тако даље. Напиши програм који исписује смене годишњих доба током пет година.

У овом задатку ћемо више пута пролазити кроз једну исту листу, па ћемо употребити приступ на основу индекса. Ако су имена годишњих доба написана у једној листи, тада је потребно исписивати редом елементе на позицијама 0, 1, 2, 3, затим опет 0, 1, 2, 3 и тако даље. Ако направимо петљу у којој ће бројачка променљива узимати редом вредности од 0 до 19 (то је 20 годишњих доба која се смењују током пет година), тада се серија бројева 0, 1, 2, 3, 0, 1, 2, 3, … може добити тако што се узимају остаци при дељењу са 4 бројева од 0 до 19. Имајући ово у виду, исправи наредни програм.

Пролазак кроз листу парова имена и презимена научника

У петљи можемо проћи и кроз све елементе листе парова.

Ако је дата листа која садржи парове имена и презимена неколико научника, напиши програм који прави њихов списак тј. исписује име и презиме сваког од научника у посебном реду.

Формирајмо прво списак неколико научника.

Један начин да прођемо кроз листу парова је да се понашамо као да је у питању било која друга листа тј. да уведемо променљиву која ће имати редом вредности једног по једног уређеног пара. Појединачним елементима пара (имену и презимену), онда можемо да приступимо на основу индекса у оквиру пара.

Слично, можемо употребити и бројачку променљиву која ће пролазити кроз индексе листе и затим сваком пару приступати на основу његовог индекса у листи, а онда сваком елементу пара (имену и презимену) приступати на основу његовог индекса у пару.

Ипак, од свих, можда најелегантније решење се добија ако се употреби могућност распакивања пара, тј. коришћења две променљиве које ће редом узимате имена и презимена научника.

Свако слово у посебном реду

Већ смо видели да се у многим случајевима ниска може користити веома слично као листа карактера. У том светлу, могуће је у петљи проћи кроз све карактере ниске.

Напиши програм који исписује слово по слово учитане речи, свако у посебном реду.

Примена истог израчунавања на више података

У неколико примера које смо срели до сада смо исто израчунавање применили на више различитих података. Размотримо један пример тог типа.

Трајање путовања

Трајање путовања зависи од брзине и растојања. Претпоставимо да у 8:35 крећемо из Београда до Новог Сада и да треба да пређемо пут од 93,38 km. Напиши скрипт који израчунава када ћеш стићи у Нови Сад ако се крећеш просечном брзином од a) 120km/h, b) 110km/h и c) 100km/h.

Најлошији приступ решавању проблема овог типа је то да се код који врши израчунавање понови више пута у програму и да се у том коду варирају вредности улазних података.

Ово решење је очигледно веома лоше јер се скоро идентичан програмски код јавља на више места, што је компликовано било написати, а још теже је одржавати (сваку измену је потребно поновити на три места). Један могући приступ да се ово поправи је да се код организује у функције које ће се онда позвати за различите вредности брзине.

Још један могући приступ решавању овог проблема заснива се на томе да се израчунавање врши у петљи на почетку чијег тела се учитавају улазни подаци. Проблем са овим приступом је то што корисник током рада скрипта мора да унесе улазне податке (они више нису део скрипта).

Проблеми овог типа се често решавају тако што се направи торка или листа могућих вредности улазних података и петља која узима једну по једну улазну вредност и за њу врши тражено израчунавање. На пример,

Овај приступ не искључује дефинисање помоћних функција или процедура (поготово ако су оне вишеструко употребљиве, тј. такве да се могу користити и при решавању других задатака).

Једна важна поука овог задатка је да разлика у брзини од целих 20 km/h, што је разлика између опуштене вожње и јурцања по ауто-путу уз кршење прописа и што често може бити разлика између живота и смрти на овој релацији утиче на време пута мање од 10 минута. Дакле, опрезном вожњом се не губи пуно времена, а пуно се добија.

Последњи контролни

Петар је током полугодишта радио 4 контролна задатка и добијао је редом оцене 3, 5, 4, 2. Јуче је радио последњи контролни задатак и занима га која ће му бити закључна оцена ако добије 1, 2, 3, 4 или 5. Напиши програм који то одређује.

Пошто оцене које анализирамо чине опсег природних бројева, уместо навођења вредности у торки могли смо употребити и петљу облика for poslednja_ocena in range(1, 6):.

Учитавање и обрада листе

У многим случајевима писање скриптова које ћемо сами користити је задовољавајуће решење и навођење свих улазних вредности се може урадити на почетку скрипта. Ипак, понекада желимо да испрограмирамо и апликације које учитавају податке са улаза, пре него што их обраде. Када се подаци који се учитавају обрађују један по један (као што је то био случај у претходним примерима), тада се учитавање може урадити на почетку петље која врши обраду података и није неопходно користити структуре података. Са друге стране, често желимо да пронађемо неку заједничку статистику свих података (на пример, збир, просек, минимум или максимум) и тада је згодно да све податке прво учитамо у листу, да бисмо онда обраду извршили коришћењем уграђених функција за рад са листама. Ако података има баш пуно, ово може захтевати превише меморије, па је обраду можда боље урадити ручном имплементацијом тих алгоритама (што ћемо илустровати у наредном поглављу), међутим, у већини случајева учитавање података у листу и након тога обрада те листе је сасвим задовољавајуће решење. Прикажимо неколико примера те технике.

Просек учитаних оцена

Напиши програм који учитава број оцена ученика, а затим и појединачне оцене (сваку у посебном реду) и на крају одређује и исписује просечну оцену тог ученика.

Елементе у листу можемо учитати тако што на почетку кренемо од празне листе (листе []), а затим у петљи учитавамо један по један елемент и додајемо га у листу методом append.

Изврши корак по корак претходни програм и посматрај како се садржај листе мења током учитавања њених елемената.

Пролазак кроз речник

Још једна структура података кроз чије елементе је могуће проћи коришћењем петље облика for ... in ... : је речник.

Површине земаља

Ако је дат речник који садржи називе неколико земаља и њихове површине, напиши програм који формира списак земаља тако што за сваку земљу у посебном реду напише њен назив и површину (земље могу бити исписане у произвољном редоследу).

Исписаћемо једну по једну земљу и њену површину.

У претходном програму променљива zemlja редом узима вредности назива земаља (кључева у датом речнику).

Још један користан начин да се прође кроз елементе речника је да се употреби метода items() кроз чији се резултат може проћи на исти начин којим се пролази кроз све елементе листе парова.

Формирање речника на основу учитаних података

Елемент у речник можемо додати доделом облика recnik[kljuc] = vrednost. Речници се веома често користе да елементима придруже њихов број појављивања. Прикажимо један задатак овог типа.

Освојени турнири

Напиши програм који учитава број великих тениских турнира који су играни током неке године и имена победника сваког од тих турнира, а затим исписује број турнира које је освојио свако од тих тенисера.

Домаћи задатак

Ако током часа нисте завршили неки задатак, уради га за домаћи, а након тога уради и наредне задатке. Додатне задатке за вежбу можеш пронаћи овде.

Куповина за све паре

Наталија има 1000 динара. Жели да купи чоколаде које коштају 120 динара, чипс који кошта 89 динара или кока-коле које коштају 135 динара. Ако буде куповала све производе исте врсте, напиши програм који одређује колико производа може да купи и колико јој динара остаје.

Свака трећа реч

Дата је торка која садржи ниске. Издвојити у листу оне ниске чији индекси су дељиви са 3, а затим их исписати.